from python_baway.common.xcommon import input_value_util_well, xshow_dict
import re
import pickle
import os

xmails_set = set()
xmobiles_set = set()
xusernames_set = set()
xnicknames_set = set()
xfilename = 'ppt11_page38_user_register.tmp.dat'
if os.path.exists(xfilename):
    xfile_r = open(xfilename, 'rb')
    xusers_data = pickle.load(xfile_r)
    xfile_r.close()
    for xmobile, xdata in xusers_data.items():
        xmails_set.add(xdata['mail'])
        xmobiles_set.add(xmobile)
        xusernames_set.add(xdata['username'])
        xnicknames_set.add(xdata['nickname'])
else:
    xusers_data = {}

xmenu = ('注册', '退出')
xmenu_str = ''
xmenu_len = len(xmenu)
for i in range(1, 1 + xmenu_len):
    xmenu_str += f'{i} -- {xmenu[i - 1]}\n'

while True:
    if len(xusers_data) == 0:
        print('还没有用户信息。')
    else:
        print('已注册用户如下：')
        xshow_dict(xusers_data)

    print(xmenu_str)
    xchoice = input_value_util_well(int, '请选择：', (
        (lambda x: 1 <= x <= xmenu_len), None
    ), xerror_prompt='您的选择有误，请重新选择！')

    if 1 == xchoice:

        xmail_reg = re.compile(r'^[\w\-\.]+@[\w\-\.]+$')  # 没按PPT，自由发挥了
        xmail = input_value_util_well(str, '请输入您的邮箱：', (
            (lambda x: xmail_reg.match(x)), None
        ), (
            (lambda x: not x in xmails_set), '这个邮箱已经注册过了。'
        ), xerror_prompt='您的输入不是有效的邮箱地址，请重新输入！', 要求='xxx@xxx.xx')
        print(f'邮箱：|{xmail}|')

        xmobile_reg = re.compile(r'^1[3578]\d{9}$')


        def xmobile_unify(x):
            xdigits_table = re.findall(r'(\d+)', x)
            xdigists = []
            for x in xdigits_table:
                xdigists.append(x)
            xdigists_str = ''.join(xdigists)
            return xdigists_str


        xmobile = input_value_util_well(str, '请输入您的手机号：', (
            None, xmobile_unify
        ), (
            (lambda x: xmobile_reg.match(x)), None
        ), (
            (lambda x: not x in xmobiles_set), '这个手机号已经注册过了。'
        ), xerror_prompt='您的输入不是有效的手机号码，请重新输入！', 要求='1xx xxxx xxxx')
        print(f'手机号：|{xmobile}|')

        xusername_reg = re.compile(r'^\w{4,}$')
        xusername = input_value_util_well(str, '请输入您的用户名：', (
            (lambda x: xusername_reg.match(x)), None
        ), (
            (lambda x: not x in xusernames_set), '这个用户名已经注册过了。'
        ), xerror_prompt='您的输入的用户名不符合要求，请重新输入！', 要求='用户名不少于4位字符')
        print(f'用户名：|{xusername}|')

        xnickname_reg = re.compile(r'^\w{2,}$')
        xnickname = input_value_util_well(str, '请输入您的昵称：', (
            (lambda x: xnickname_reg.match(x)), None
        ), (
            (lambda x: not x in xnicknames_set), '这个昵称别人正在使用中。'
        ), xerror_prompt='您的输入的昵称不符合要求，请重新输入！', 要求='昵称不少于2位字符')
        print(f'昵称：|{xnickname}|')

        xpwd_reg = re.compile(r'^\d{6}$')
        xpwd = input_value_util_well(str, '请输入您的密码：', (
            (lambda x: xpwd_reg.match(x)), None
        ), xerror_prompt='您的输入的密码不符合要求，请重新输入！', 要求='密码是6位数字')

        xdata = {'mail': xmail,
                 'mobile': xmobile,
                 'username': xusername,
                 'nickname': xnickname,
                 'pwd': xpwd}
        xusers_data[xmobile] = xdata

    elif 2 == xchoice:

        xfile_w = open(xfilename, 'wb')
        pickle.dump(xusers_data, xfile_w)
        xfile_w.close()
        break
